// 生成一个7位的字母和数字的随机字符串以【.】隔开拼接，用于dispatch的初始化字符串生成type
const randomString = () => Math.random().toString(36).substring(7).split('').join('.');

// 创建一个全局的唯一的store
export default function createStore(reducer){
  // 创建一个全局的私有变量state，此变量为只读变量，只有通过action触发reducer纯函数，才可以修改
  let state;
  // 收集订阅监听函数的集合
  let listeners = [];
  // 获取全局的state的方法
  let getState = () => state;
  // 派发action
  let dispatch = (action) => {
    // 执行reducer纯函数，返回一个新的state，替换全局的state
    state = reducer(state, action);
    // 执行listeners集合中的订阅方法
    listeners.forEach(listener => listener());
  }
  // 订阅函数收集
  let subscribe = (listener) => {
    // 收集当前订阅函数
    listeners = [...listeners, listener];
    // 取消订阅
    return function unsubscribe(){
      // 查询当前订阅函数在listeners集合中的位置，删除当前订阅函数
      const index = listeners.indexOf(listener);
      listeners.splice(index, 1);
    }
  }
  // 初始化state
  dispatch({type: `@@INIT${randomString()}`});
  // 返回redux的核心三个接口，getState读取state，dispatch触发修改state，subscribe订阅state修改
  return {
    getState, 
    dispatch, 
    subscribe
  }
}